'''
此模块用于在指定目录下遍历所有Excel文件(以.xls和.xlsx为标记)，并将其工作簿中的Sheet表列出来。
一个含有多个Sheet表的Excel工作簿默认使用第一个。将目录下的Excel文件结构以xlsx文件输出，用于配置使用的数据表。

1.获取指定目录下的所有excel文件及其内部的Sheet表。
2.将所有Excell文件及其内部的Sheet表结构以xlsx文件输出，便于手动选择需要处理的Sheet表。
    默认路径为：当前工作路径下 "config\使用表配置.xlsx"文件。
3.与out_excel_list相对，用于读取out_excel_list输出的目录经过手动设置后使用的Sheet表。
'''

import logging
import os
import os.path
import pandas as pd
from datatools.workpath.workdir import get_all_excel_files
from datatools.excel.excelreader import ExcelReader
from datatools.excel.excelformat import XlsxWriterFormat
from datatools.mylogger.myloggerconfig import set_log_mode

CONFIG_DIR = "config"

mylog = logging.getLogger()

def create_config_dir():
    '''在当前目录下自动创建配置文件所在目录config
    '''
    if not os.path.exists(CONFIG_DIR):
        os.mkdir(CONFIG_DIR)

def get_all_excel_struct(dir_path):
    '''获取指定目录下的所有excel文件及其内部的Sheet表。
    '''
    all_file_path = get_all_excel_files(dir_path)
    count = 1001
    data = []
    for index,line in all_file_path.iterrows():
        name = line['文件名称']
        path = line['文件路径']
        if path.find('~$') != -1:
            continue
        logging.info("开始获取文件[{}]的相关信息...".format(path))
        er = ExcelReader(path)
        sheet_names = er.getSheetNames()
        if len(sheet_names) == 1:
            data.append([count,path,name,sheet_names[0],'是'])
            count += 1
        else:
            first = False
            for sheet_name in er.getSheetNames():
                if not first:
                    first = True
                    data.append([count,path,name,sheet_name,'是'])
                else:
                    data.append([count,path,name,sheet_name,'否'])
                count += 1
    sheet_df = pd.DataFrame(data,columns=['文件编号','文件路径','文件名称','Sheet表名','是否使用'])
    sheet_df.insert(sheet_df.shape[1],'年度','')
    sheet_df.insert(sheet_df.shape[1],'标记','')
    sheet_df.insert(sheet_df.shape[1],'备注','')
    return sheet_df

def out_excel_path_struct(all_excels,path="使用表目录.xlsx"):
    '''将所有Excell文件及其内部的Sheet表信息统一输出，便于手动选择需要处理的Sheet表。
    '''
    create_config_dir()
    path = os.path.join(CONFIG_DIR,path)
    colunmn_width = {'文件路径':50,'文件名称':30}
    with XlsxWriterFormat(path) as xw:
        xw.to_excel(all_excels,sheetname="文件目录",colunmn_width=colunmn_width,title="指定路径下所有Sheet表目录")

def get_excel_path_struct(path="使用表目录.xlsx"):
    '''与out_excel_path_struct相对，用于读取out_excel_path_struct输出的目录经过手动设置后使用的Sheet表。
    返回：
      excel_path_struct：配置后实际使用的excel文件。
    '''
    path = os.path.join(CONFIG_DIR,path)
    excel_path_struct = pd.read_excel(path,header=1)
    excel_path_struct = excel_path_struct.loc[excel_path_struct['是否使用'].isin(['是','Y',True,'TRUE','True'])]
    return excel_path_struct

def analysis_excels(excel_path_struct):
    '''读取excel_path_struct表中的数据，并获取其基本信息。
    excel_path_struct:包含excel路径信息的DataFrame对象，由get_excel_path_struct函数结果处理后生成。
    返回：excel_infos
        @excel_infos:分析给出的excel文件路径结构对应的Excel表的列位置、列名列表、列名类型等基本信息列表。
    '''
    excel_infos = []
    for index,line in excel_path_struct.iterrows():
        files_info = {}
        files_info['file_id'] = line['文件编号']
        files_info['file_path'] = line['文件路径']
        files_info['sheetname'] = line['Sheet表名']
        er = ExcelReader(files_info['file_path'])
        hdr = er.detectHeader(files_info['sheetname'])
        files_info.update(hdr)
        excel_infos.append(files_info)
    return excel_infos